001 /**
002 * Created by IntelliJ IDEA.
003 * User: Wei Wang
004 * Date: Nov 28, 2002
005 * Time: 2:37:43 AM
006 */
007
008 package EVolve.visualization.XYViz.ValRefViz.HotSpotViz;
009
010 import EVolve.util.painters.StackHotspotPainter;
011 import EVolve.util.ThreadChooser;
012 import EVolve.data.Element;
013 import EVolve.visualization.AutoImage;
014 import EVolve.visualization.Dimension;
015 import EVolve.visualization.ValueDimension;
016 import EVolve.visualization.ReferenceDimension;
017
018 import javax.swing.*;
019 import java.util.*;
020 import java.awt.event.*;
021
022 public class StackHotspotViz extends HotSpotVisualization{
023 private ArrayList menuList;
024 private String dataFilterName[];
025 private JMenuItem itemChangThread;
026 private HashMap methodStacks;
027 private ThreadChooser td;
028 private Stack stack;
029
030 public StackHotspotViz() {
031 super();
032 dataFilterName = new String[2];
033
034 dataFilterName[0] = "Bytecode";
035 dataFilterName[1] = "Method";
036
037 menuList = new ArrayList();
038 td = new ThreadChooser(imageMap,false);
039 painters[0] = new StackHotspotPainter();
040 painters[1] = painters[0];
041 }
042
043 public Dimension[] createDimension() {
044 Dimension [] returnDimension = new Dimension[3];
045
046 xAxis = new ValueDimension();
047 yAxis = new ReferenceDimension();
048 zAxis = new ReferenceDimension();
049
050 returnDimension[0] = xAxis;
051 returnDimension[1] = yAxis;
052 returnDimension[2] = zAxis;
053
054 return returnDimension;
055 }
056
057 protected JPanel createConfigurationPanel() {
058 JPanel returnVal = super.createConfigurationPanel();
059
060 comboPainter.removeItemAt(1);
061
062 return returnVal;
063 }
064
065 protected ArrayList createOptionalMenu() {
066 if (menuList.size() > 0) return null;
067
068 menuList.clear();
069 itemChangThread = new JMenuItem("Switch thread...");
070 itemChangThread.setMnemonic(KeyEvent.VK_T);
071 itemChangThread.addActionListener(new ActionListener() {
072 public void actionPerformed(ActionEvent e) {
073 visualize();
074 }
075 });
076
077 menuList.add(itemChangThread);
078 return menuList;
079 }
080
081 public void preVisualize() {
082 super.preVisualize();
083 image = null;
084 methodStacks = new HashMap();
085 }
086
087 public void receiveElement(Element element) {
088 long threadId = zAxis.getField(element);
089
090 switchThread(threadId);
091 long x = xAxis.getField(element);
092 long y = yAxis.getField(element);
093 long z = element.isOptional() ? Integer.MAX_VALUE : Integer.MIN_VALUE;
094
095 phaseDetector.collectData(x/interval,y);
096 ((StackHotspotPainter)painter).setStack(stack);
097 paint(x,y,z);
098 }
099
100 public void visualize() {
101 String selected = null;
102 if (imageMap.size() == 0 ) return;
103 while (selected==null) {
104 selected = td.showDialog();
105 if (selected != null) {
106 image = (AutoImage)imageMap.get(new Long(selected.substring(7,selected.length())));
107 sort();
108 selected = null;
109 break;
110 }
111 }
112
113 }
114
115 protected void switchThread(long threadId) {
116 if (currentThread != threadId) {
117 stack = (Stack)methodStacks.get(new Long(threadId));
118 if (stack == null) {
119 stack = new Stack();
120 methodStacks.put(new Long(threadId),stack);
121 }
122 super.switchThread(threadId);
123 }
124 }
125
126 public Object clone() {
127 StackHotspotViz o = (StackHotspotViz)super.clone();
128 o.createOptionalMenu();
129 o.dataFilterName = new String[dataFilterName.length];
130 for (int i=0; i<dataFilterName.length; i++)
131 o.dataFilterName[i] = dataFilterName[i];
132 if (methodStacks == null) {
133 o.methodStacks = (HashMap)methodStacks.clone();
134 Iterator it = methodStacks.keySet().iterator();
135 while(it.hasNext()) {
136 Object key = it.next();
137 o.methodStacks.put(key, methodStacks.get(key));
138 }
139 }
140 o.td = new ThreadChooser(o.imageMap,false);
141 o.stack = (Stack)stack.clone();
142 o.menuList.clear();
143 return o;
144 }
145 }